#include "ZXml.h"


ZXmlDoc::ZXmlDoc()
	: m_pDomDoc(NULL)
{
}

ZXmlDoc::~ZXmlDoc()
{
	delete m_pDomDoc;
}

bool ZXmlDoc::InitLoadFrom( const QString& sXmlStr )
{
	m_bLoad = true;
	m_pDomDoc = new QDomDocument(tr("zXml"));
	return m_pDomDoc->setContent(sXmlStr);
}

bool ZXmlDoc::InitSaveTo()
{
	m_bLoad = false;
	m_pDomDoc = new QDomDocument(tr("zXml"));
	return true;
}

QString ZXmlDoc::GetXmlStr(const QString& sClassName)
{
	m_rootElem.setAttribute(PackageClassAttr, sClassName);
	return m_pDomDoc->toString();
}

QDomElement ZXmlDoc::AppendChild( QDomElement& parentElem, const QString& elemName )
{
	QDomElement tag = m_pDomDoc->createElement(elemName);
	parentElem.appendChild(tag);
	return tag;
}

QDomElement ZXmlDoc::AppendChild( QDomElement& parentElem, const QString& elemName, int iElemVal )
{
	QDomElement tag = m_pDomDoc->createElement(elemName);
	tag.setAttribute(ValAttr, iElemVal);
	parentElem.appendChild(tag);
	return tag;
}

QDomElement ZXmlDoc::AppendChild( QDomElement& parentElem, const QString& elemName, double dElemVal )
{
	QDomElement tag = m_pDomDoc->createElement(elemName);
	tag.setAttribute(ValAttr, dElemVal);
	parentElem.appendChild(tag);
	return tag;
}

QDomElement ZXmlDoc::AppendChild( QDomElement& parentElem, const QString& elemName, const QString& sElemVal )
{
	QDomElement tag = m_pDomDoc->createElement(elemName);
	tag.setAttribute(ValAttr, sElemVal);
	parentElem.appendChild(tag);
	return tag;
}

QDomElement ZXmlDoc::AppendChild( QDomElement& parentElem, const QString& elemName, const QByteArray& byteArr )
{
	QDomElement tag = m_pDomDoc->createElement(elemName);
	tag.setAttribute(ValAttr, ByteArrToStr(byteArr));
	parentElem.appendChild(tag);
	return tag;
}

QDomElement ZXmlDoc::AppendChild( QDomElement& parentElem, const QString& elemName, ZXmlObj& xmlObj )
{
	QDomElement newNode = AppendChild(parentElem, elemName);
	newNode.setAttribute(TypeAttr, xmlObj.GetClassName_Z());
	xmlObj.ExchangeByXml(*this, newNode);
	return newNode;
}

bool ZXmlDoc::GetVal( QDomElement& docElem, int& iElemVal )
{
	if(docElem.isNull()) 
	{
		return false;
	}

	if (!docElem.hasAttribute(ValAttr))
	{
		return false;
	}
	
	bool bReVal = false;
	iElemVal = docElem.attribute(ValAttr).toInt(&bReVal);
	return bReVal;
}

bool ZXmlDoc::GetVal( QDomElement& docElem, double& dElemVal )
{
	if(docElem.isNull()) 
	{
		return false;
	}

	if (!docElem.hasAttribute(ValAttr))
	{
		return false;
	}

	bool bReVal = false;
	dElemVal = docElem.attribute(ValAttr).toDouble(&bReVal);
	return bReVal;
}

bool ZXmlDoc::GetVal( QDomElement& docElem, QString& sElemVal )
{
	if(docElem.isNull()) 
	{
		return false;
	}

	if (!docElem.hasAttribute(ValAttr))
	{
		return false;
	}

	sElemVal = docElem.attribute(ValAttr);
	return true;
}

bool ZXmlDoc::GetVal( QDomElement& docElem, QByteArray& byteArr )
{
	if(docElem.isNull()) 
	{
		return false;
	}

	if (!docElem.hasAttribute(ValAttr))
	{
		return false;
	}

	byteArr = StrToByteArr(docElem.attribute(ValAttr));
	return true;
}

bool ZXmlDoc::GetVal( QDomElement& docElem, ZXmlObj* pXmlObj )
{
	if (pXmlObj == NULL)
	{
		return false;
	}

	return pXmlObj->ExchangeByXml(*this, docElem);
}

QString ZXmlDoc::ByteArrToStr( const QByteArray& byteArr )
{
	return byteArr.toHex();
}

QByteArray ZXmlDoc::StrToByteArr( const QString& str )
{
	return QByteArray::fromHex(str.toAscii());
}

QDomElement ZXmlDoc::GetRootElem()
{
	if (!m_rootElem.isNull())
	{
		return m_rootElem;
	}
	
	if (m_bLoad)
	{
		m_rootElem = m_pDomDoc->documentElement();
	}
	else
	{
		m_rootElem = m_pDomDoc->createElement("root");
		m_pDomDoc->appendChild(m_rootElem);
	}

	return m_rootElem;
}
// 
// ZXmlObj* ZXmlDoc::CreateObjByXmlElem( const QDomElement& elem )
// {
// 	if(elem.isNull()) 
// 	{
// 		return NULL;
// 	}
// 
// 	if (!elem.hasAttribute(TypeAttr))
// 	{
// 		return NULL;
// 	}
// 
// 	ZXmlObj* pNewObj = dynamic_cast<ZXmlObj*>(ZDynObject::CreateObjFromName(elem.attribute(ValAttr)));
// 	return pNewObj;
// }
